package com.kongge.algorithm.demo;

/**
 * 位操作
 * @author kongge
 *
 */
public class BitOperation implements IAlgorithm{
	
	public void execute() {
		int number = 16;
		int Number1Count = getNumberOf1InBinary(number);
		System.out.println(number + " 的2进制里面，包含1的个数为： " + Number1Count);
		
		System.out.println(number + " 是2的整数次方？ " + isIntegerSquareOf2(number));
		
		int firstNum = 1;
		int secondNum = 2;
		System.out.println(firstNum + "的二进制需要改变 " + getChangeNumberBetweenTwoNumberInBinary(firstNum, secondNum) + " 位才能得到" + secondNum);
	}

	/**
	 * 判断一个数的二进制里面，包含1的个数
	 * 例如1100里面1的个数为2
	 * 分析：把一个整数减去1，再和原整数做与运算，会把该整数最右边的1变为0，
	 * 那么，一个整数的二进制表示中有多少个1，就可以进行多少次这样的操作
	 * @param number
	 * @return
	 */
	private int getNumberOf1InBinary(int number) {
		int num = number;
		int count = 0;
		while (num != 0) {
			count++;
			num = (num - 1) & num;
		}
		return count;
	}
	
	/**
	 * 判断一个数是否是2的整数次方
	 * @param number
	 * @return
	 */
	private boolean isIntegerSquareOf2(int number) {
		return (((number - 1) & number) == 0);
	}
	
	/**
	 * 输入两个整数m和n，计算需要要改变m的二进制表示中的多少位才能得到n
	 * 分析：m和n做异或运算，得到的新整数里面1有多少位就需要改变多少位
	 * @param firstNum
	 * @param secondNum
	 * @return
	 */
	private int getChangeNumberBetweenTwoNumberInBinary(int firstNum, int secondNum) {
		int num = firstNum ^ secondNum;
		int count = getNumberOf1InBinary(num);
		return count;
	}
}
